package com.miniblog.user.server.controller;

import com.alibaba.druid.support.json.JSONUtils;
import com.github.pagehelper.PageInfo;
import com.miniblog.common.utils.JwtUtils;
import com.miniblog.common.utils.Msg;
import com.miniblog.user.api.entity.User;
import com.miniblog.user.server.service.AuthService;
import com.miniblog.user.server.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 路径：com.typ.blog.controller.UserController.java
 * 类名：UserController.java
 * 功能：用户信息
 * 备注：
 * 创建人：typ
 * 创建时间：2019/10/21 21:46
 */
@Slf4j
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private AuthService authService;

    /**
     * 方法名：login
     * 功能：登录
     * 描述：
     * 创建人：typ
     * 创建时间：2019/11/12 21:26
     */
    @PostMapping("login")
    public Msg login(@RequestBody User user) {
        try {
            User _user = userService.login(user.getUsername());
            if (!Objects.isNull(user)) {
                if (Objects.equals(user.getPassword(), _user.getPassword())) {
                    // 生成token，并存储redis缓存中
                    String token = JwtUtils.createToken(String.valueOf(_user.getId()));
                    Map<String, Object> userMap = new HashMap<>();
                    userMap.put("userId", _user.getId());
                    userMap.put("userName", _user.getUsername());
                    userMap.put("nickName", _user.getNickname());
                    userMap.put("email", _user.getEmail());
                    userMap.put("token", token);
                    // 用户信息添加缓存
                    authService.addCache(userMap);
                    return Msg.success().add(userMap);
                } else {
                    return Msg.param().add("用户名或密码有误");
                }
            } else {
                return Msg.param().add("用户名或密码有误");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> login 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * @methodName：qryUserIdByUser
     * @description：缓存中获取用户信息
     * @author：tanyp
     * @dateTime：2020/1/12 15:55
     * @Params： [userId]
     * @Return： com.miniblog.common.utils.Msg
     * @editNote：
     */
    @GetMapping("qryUserIdByUser")
    public Msg qryUserIdByUser(String userId) {
        try {
            Object user = authService.qryUserIdByUser(userId);
            return Msg.success().add(JSONUtils.parse(user.toString()));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> qryUserIdByUser 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * @MethodName： userList
     * @Description：获取用户信息列表
     * @Author： tanyp
     * @Date： 2020/1/8 15:31
     * @Params： [pageNum, pageSize, search]
     * @Return： com.miniblog.common.utils.Msg
     * @Reviser：
     */
    @GetMapping("userList")
    public Msg userList(@RequestParam(required = false, defaultValue = "1") Integer pageNum,
                        @RequestParam(required = false, defaultValue = "10") Integer pageSize,
                        @RequestParam(required = false, defaultValue = "") String search) {
        PageInfo<User> userList = null;
        try {
            userList = userService.list(pageNum, pageSize, search);
            return Msg.success().add(userList);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> userList 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * 方法名：userEdit
     * 功能：修改用户信息
     * 描述：
     * 创建人：typ
     * 创建时间：2019/11/26 21:09
     */
    @PostMapping("userEdit")
    public Msg userEdit(@RequestBody User user) {
        try {
            userService.save(user);
            return Msg.success().add("修改成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> userEdit 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * 方法名：userDel
     * 功能：删除用户
     * 描述：
     * 创建人：typ
     * 创建时间：2019/11/26 21:11
     */
    @RequestMapping("userDel")
    public Msg userDel(@RequestParam Integer id) {
        try {
            int rows = userService.del(id);
            return Msg.success().add("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> userDel 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * 方法名：updPassword
     * 功能：修改密码
     * 描述：
     * 创建人：typ
     * 创建时间：2019/11/26 21:28
     */
    @GetMapping("updPassword")
    public Msg updPassword(Integer userId, String oldPassword, String newPassword, String password) {
        try {
            if (!Objects.equals(newPassword, password)) {
                return Msg.param().add("两次输入的密码不符");
            }
            // 根据id获取用户信息
            User user = userService.qryByUserId(userId);
            if (!Objects.isNull(user) && Objects.equals(oldPassword, user.getPassword())) {
                userService.updPwd(userId, password);
                return Msg.success().add("修改成功");
            }
            return Msg.param().add("原密码有误！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> updPassword 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * 方法名：register
     * 功能：注册用户
     * 描述：
     * 创建人：typ
     * 创建时间：2019/11/12 21:26
     */
    @PostMapping("register")
    public Msg register(@RequestBody User user) {
        try {
            userService.save(user);
            return Msg.success().add("注册成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> register 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

    /**
     * 方法名：logout
     * 功能：退出：删除缓存信息
     * 描述：
     * 创建人：typ
     * 创建时间：2019/11/18 20:58
     */
    @GetMapping("logout")
    public Msg logout(String userId) {
        try {
            authService.delCache(userId);
            return Msg.success().add("退出成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("请求 UserController -> logout 异常：{}", e.getMessage());
            return Msg.error().add("服务器异常！");
        }
    }

}
